package com.dingreading.cloud.common.util.aliyun;

import com.dingreading.cloud.common.base.R;
import com.dingreading.cloud.common.util.DateUtil;
import com.dingreading.cloud.common.util.IpUtil;
import com.dingreading.cloud.common.util.MD5Util;
import com.dingreading.cloud.common.util.RC4Util;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * 阿里云CDN工具
 */
public class MstCdnUtil {

    public static final String PROD_REFERER = "www.xzzqmst.com";
    public static final String TEST_REFERER = "mst.dingreading.com";

    /**
     * 小程序特殊referer : https://servicewechat.com/wx0d348e40e8a1ae28/devtools/page-frame.html
     */
    // 名师堂学霸营
    public static final String XCX_XBY_REFERER = "servicewechat.com/wx0d348e40e8a1ae28";
    // 名师堂行知自由家
    public static final String XCX_ZYJ_REFERER = "servicewechat.com/wx8e579b09bd088845";

    // 视频有效时间 2小时
    public static final int VIDEO_EXPIRE = 7200;
    // 图片有效时间 30分钟
    public static final int IMG_EXPIRE = 1800;
    // 下载资料有效时间 10分钟
    public static final int DOWN_EXPIRE = 600;

    /**
     * URL鉴权方式A
     *
     * @param url 文件存储路劲，以/开头
     * @return ?auth_key=1703663821-0-0-450074a832c9e9ea50ae1a5821e7a81c
     */
    public static String getUrlAuthA(String url) {
        url = "/" + url;
        // 签算服务器生成鉴权URL的时间，精确到秒
        long timestamp = new Date().getTime() / 1000 + 7200;
        // 随机数，默认为0
        String rand = "0";
        // 用户ID，默认为0
        String uid = "0";
        // 鉴权密钥
        String privateKey = "xzzqmst";

        String rule = timestamp + "-" + rand + "-" + uid;
        // 生成规则：URI-Timestamp-rand-uid-PrivateKey
        String sstring = url + "-" + rule + "-" + privateKey;
        return "?auth_key=" + rule + "-" + MD5Util.string2MD5(sstring);
    }

    /**
     * 获取网页端cdn带token的加速访问文件地址
     *
     * @param cdnDomain     cdn加速域名
     * @param cdnPrivateKey token加密秘钥
     * @param url           文件存储地址
     * @param expire        过期时间/秒
     */
    public static String getCdnUrl(
            String cdnDomain, String cdnPrivateKey, String url, String ip, long expire
    ) {
        // 拼接token
        String baseToken = "web-" + expire + "-" + ip + "-" + url;
        // token加密
        String token = RC4Util.encry_RC4_string(baseToken, cdnPrivateKey);
        // 得到cdn访问文件地址
        return cdnDomain + url + "?token=" + token;
    }

    /**
     * 远程鉴权token
     */
    public static String getToken(String url, String ip, String expire, String cdnPrivateKey) {
        String baseToken = "web-" + expire + "-" + ip + "-" + url;
        String token = RC4Util.encry_RC4_string(baseToken, cdnPrivateKey);
        return token;
    }

    /**
     * 获取小程序cdn带token的加速访问文件地址
     *
     * @param cdnDomain     cdn加速域名
     * @param cdnPrivateKey token加密秘钥
     * @param url           文件存储地址
     * @param expire        过期时间/秒
     */
    public static String getXcxCdnUrl(
            String cdnDomain, String cdnPrivateKey, String url, String ip, long expire
    ) {
        // 拼接token
        String baseToken = "xcx-" + expire + "-" + ip + "-" + url;
        // token加密
        String token = RC4Util.encry_RC4_string(baseToken, cdnPrivateKey);
        // 得到cdn访问文件地址
        return cdnDomain + url + "?token=" + token;
    }


    /**
     * 获取请求头的ip
     */
    public static R<Object> getIp(HttpServletRequest request) {
        String ip = IpUtil.getIpAddr(request);
        if (StringUtils.isBlank(ip)) {
            return R.fail("未获取到客户端ip");
        }
        return R.ok(ip);
    }

    /**
     * 获取视频的有效时间
     */
    public static long getVideoExpire() {
        Date expireTime = DateUtil.addSecond(DateUtil.getNowDatetime(), VIDEO_EXPIRE);
        return expireTime.getTime();
    }

    /**
     * 获取图片的有效时间
     */
    public static long getImgExpire() {
        Date expireTime = DateUtil.addSecond(DateUtil.getNowDatetime(), IMG_EXPIRE);
        return expireTime.getTime();
    }

    /**
     * 获取下载文件的有效时间
     */
    public static long getDownExpire() {
        Date expireTime = DateUtil.addSecond(DateUtil.getNowDatetime(), DOWN_EXPIRE);
        return expireTime.getTime();
    }


//    public static void main(String[] args) {
//        String s1 = getUrlAuthA("/493687a37b925b.jpg");
//        System.out.println("s1 = " + s1);
//        String s2 = getUrlAuthA("/transcode.mp4");
//        System.out.println("s2 = " + s2);
//        String s3 = getUrlAuthA("/xiaozhangbao.zip");
//        System.out.println("s3 = " + s3);
//        String s3 = getUrlAuthA("/store/20220622/0C9861581E9642D1BAA0D2B85FE9683A.jpeg");
//        System.out.println("s3 = " + s3);
//    }

}
